package com.chmingx.JavaBasic.cipher;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 哈希算法又称摘要算法, 作用是，对任意一组输入数据进行计算，得到一个固定长度的输出摘要
 *
 * 特点：
 * 相同输入得到相同输出
 * 不同输入大概率得到不同输出
 *
 * 好的hash算法应该满足：
 * hash碰撞尽可能低
 * 不能猜测输出
 *
 * 常用的： MD5, SHA-1, SHA-256
 *
 * 哈希算法用途
 * 从网上下载软件是，如何判断下载的软件是原始的未经篡改的？
 * 计算一下本地文件的哈希值，与官网进行对比，相同即说明文件正确，因为相同输入得到相同输出
 *
 * 比如密码不存储铭文，当用户输入明文后，计算其哈希值，与数据库里存储的暗文进行对比，一致则密码正确
 *
 * 缺点：
 * 如果明文容易猜出，则容易被“彩虹表”攻击
 */
public class MD {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        // create a messagedigist object
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        // input data
        messageDigest.update("Hello".getBytes());
        messageDigest.update("World".getBytes());
        // 获取数组表示的摘要
        byte[] result = messageDigest.digest(); // 16bytes: 68e109f0f40ca72a15e05cc22786f8e6
        // 转为16进制
        System.out.println(new BigInteger(1, result).toString(16));

        // create a MessageDigist object
        MessageDigest messageDigest1 = MessageDigest.getInstance("SHA-1");
        // input data
        messageDigest1.update("Hello".getBytes());
        messageDigest1.update("World".getBytes());
        // 获取数组表示的摘要
        byte[] result1 = messageDigest1.digest(); // 20bytes: ....
        // 转为16进制
        System.out.println(new BigInteger(1, result).toString(16));
    }
}
